#ifndef __SCENE_INTERFACE___
#define __SCENE_INTERFACE___

#include "Entry/LibExportCom.h"
#include "Data/DataExIf.h"
#include "Gene/GeneHostIf.h"
#include "Message/MsgListenerIf.h"
#include "Observer/ObsIf.h"
#include "Entity/EntityManagerIf.h"

class TCOM_API  IScene //: public IGeneHost
{
public:
	virtual ~IScene(){}

	//
	//	callback to load scene datas
	//
	virtual bool	onLoad()	= 0;

	//	
	//	ID
	//	ID that in a scene scope
	//	This is an instance id generate when scene id add into scene manager
	//
	//
	virtual void	setID(int nID)	= 0;
	virtual int		getID()const	= 0;

	//
	//	Global ID
	//	Session ID
	//
	virtual void	setGlobalID(int nGrpID)	= 0;
	virtual int		getGlobalID()const		= 0;

	//
	//	scene static ids
	//
	virtual void	setStaticID(int val)	= 0;
	virtual int		getStaticID()const		= 0;

	//	
	//	Static ID
	//	ID for static data
	//
	virtual void	setLevel(int v)	= 0;
	virtual int		getLevel()const	= 0;


	//
	//		Scene Global State
	//
	virtual void	setGState(const short& st) = 0;
	virtual short	getGState()const	= 0 ;


	//
	//		Scene Combat State
	//
	virtual void	setCombatState(const short& st) = 0;
	virtual short	getCombatState()const	= 0;

	//
	//		Scene Extension Properties
	//
	virtual	int		getProps(const short& nIdx)const	= 0;
	virtual void	setProps(const short& nIdx, int v)		= 0;

	//
	//		Scene Flags
	//
	virtual void	setFlg(const short& nIdx)	=	0;
	virtual	void	clrFlg(const short& nIdx)	=	0;
	virtual bool	hasFlg(const short& nIdx)	=	0;


	//
	//		Static Scene Data
	//
	virtual	IDataEx*	getStaticSceneData()	=	0;
	virtual void		setStaticSceneData(IDataEx* pSED)	=	0;

	//
	//		entity management
	//
	virtual IEntityManager*	getEntityMgr()	= 0;

	//
	//	visit all entities in current manager
	//
	virtual void	forEach(IEntityVisitor& v)	=	0;

	//
	//	observer
	//
	//virtual void		setObserver(IObs* pObs)	= 0;
	//virtual IObs*		getObserver()	= 0;

	//
	//	input and output device
	//
	//virtual void		setInputDevice(IMsgListener* pMsgTgt) = 0;
	//virtual void		setOutputDevice(IMsgListener* pMsgTgt)  = 0;
	//virtual IMsgListener*	getInputDevice() = 0;
	//virtual IMsgListener*	getOutputDevice() = 0;
};


#endif
